
\section{Implementar un nuevo system call llamado newcall que devuelva según requerimiento el pid del proceso que lo invocó, el ppid, los punteros al segmento text, al segmento data y al segmento stack, y los muestre por pantalla.}

\textbf{(Ver sugerencias al fondo de los enunciados). No olvide los test de prueba. (Tests o pruebas mencionados en Forma de entrega).}


\textbf{\begin{large}Implementación del system call\end{large}}

Creamos un syscall, utilizando las instrucciones provistas por la cátedra (se encuentran en la carpera \textit{material de la materia} ), llamado newcall, que devuelve el id del proceso. la pid del proceso que lo invocó, los punteros al segmento text, al segmento data y al segmento stack, y los muestre por pantalla.


\begin{verbatim}
#include "mm.h"
#include <signal.h>
#include <minix/callnr.h>
#include "mproc.h"
#include <stdlib.h>
#include <sys/stat.h>

PUBLIC int do_newcall(void){
	register int res;
	register int idPapa;

	int op = mm_in.m1_i1;
	
	register struct mproc segmento ;

	switch ( op ){
		case 1:
			res = mproc[who].mp_pid; 	/*el pid del proceso*/
			break;	
		case 2:
			idPapa = mproc[who].mp_parent; 
			res = mproc[idPapa].mp_pid; 
			/* el pid del proceso que lo invoco*/
			break;	
		case 3:
			res = mproc[who].mp_seg[D].mem_phys; /*	Me. data*/
			break;
		case 4:
			res = mproc[who].mp_seg[T].mem_phys;  /* M text */ 
			break;
		case 5:
			res =  mproc[who].mp_seg[2].mem_phys;	/*Mem. stack	*/
			break;
		default:
			printf("Para ver el id del proceso use 1 \n
                                Para ver el id del proceso que lo invoco use 2 \n
  				Para ver el data use 3 \n 
                                Para ver el text use 4 \n
                                Para ver el stack use 5 \n");
	
		}

 	return res;
}
\end{verbatim}

\subsection{Testeo}
Para testear el syscall creamos un programa ( \textbf{/test/newcall/newcalltest.c} ), el cual entra en un loop infinito.: 

\begin{verbatim}

#include <minix/callnr.h>
#include <lib.h>
#include <unistd.h>
#include <stdio.h>


int main(){
		
	printf("\n el pid del proceso que lo invoco: %d",    newcall(1));
	printf("\n el pid del padre: %x \n", newcall(2));
	printf("\n segmento text    0x%x", newcall(3));
	printf("\n segmento data    0x%x", newcall(4));
	printf("\n segmento stack   0x%x", newcall(5));
	printf("\n\n");

	while(1) {

	}
	 
	return 0;
}

 
\end{verbatim}


Ejecutando el programa y luego ps, vemos que se corresponde con lo esperado.

\begin{verbatim}
#./testsyscall &
# ID del proceso 4742
#ps
  PID TTY  TIME CMD
   34  co  0:00 -sh
   35  c1  0:00 -sh
   39  co  0:00 /usr/bin/ash
 4742  co  0:30 ./testsyscall
 4745  co  0:00 ps
  967  c1  0:00 /usr/bin/ash
\end{verbatim}
 
con F1 y F2 en la tty1 podemos ver que lo devuelto por el programa es correcto.





